iT邦幫忙

2025 iThome 鐵人賽

DAY 14
0
DevOps

DevOps 進化論:從全能型戰士到安全守門員系列 第 14

Day 14 : K8s 設定管理必修課:ConfigMap與Secret實戰

  • 分享至 

  • xImage
  •  

● 前言

🔸在 Kubernetes 部署應用程式時,設定檔(Configuration)與敏感資訊(Secrets)是不可或缺的部分。

🔸傳統上我們可能會把這些資訊硬寫在程式碼或映像檔中,但這樣做不僅不安全,也會降低靈活性。

🔸K8s 提供了 ConfigMap 與 Secret 兩個核心資源,分別用來管理「非敏感」與「敏感」的設定,幫助我們在部署中達到 配置與程式解耦 的目標。

● 專案目錄

https://ithelp.ithome.com.tw/upload/images/20250827/20178156oI31CW98af.png

● 注入架構圖

https://ithelp.ithome.com.tw/upload/images/20250827/20178156NX8Asrm3Pu.png

● 核心元件

1. ConfigMap

▪概念: 詳細說明什麼是 ConfigMap、特色、適用場景

▪建立方式: YAML 定義和指令建立兩種方式

▪使用方式: 環境變數和 Volume 掛載的完整範例

apiVersion: v1
kind: ConfigMap
metadata:
  name: demo-config
data:
  APP_ENV: "dev"
  API_URL: "http://example.com"
  app.conf: |
    # Sample configuration file
    setting1 = value1
    setting2 = value2

2. Secret

▪概念: Secret 的定義、特色、不同類型說明

▪建立方式: 包含 Opaque、TLS、Registry 等不同類型的建立方法

▪使用方式: 環境變數、Volume 掛載、ImagePullSecrets 的使用範例

▪實用技巧: Checksum annotation 觸發更新的方法

apiVersion: v1
kind: Secret
metadata:
  name: demo-secret
type: Opaque
data:
  USERNAME: ZGV2X3VzZXI=        # base64(dev_user)
  PASSWORD: MTIzNDU2            # base64(123456)

3. Deployment

概念:管理 Pod 的副本數與滾動更新,確保應用程式持續可用。

用途:在本實作中,我們建立一個 BusyBox Pod,並使用 envFrom 載入 ConfigMap 與 Secret 的設定值,方便驗證環境變數是否正確注入。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-app
spec:
  selector:
    matchLabels: { app: demo-app }
  template:
    metadata:
      labels: { app: demo-app }
    spec:
      containers:
        - name: app
          image: busybox
          command: ["sh", "-c", "printenv | grep -E 'APP_ENV|API_URL|USERNAME|PASSWORD'; sleep 3600"]
          envFrom:
            - configMapRef:
                name: demo-config
            - secretRef:
                name: demo-secret

4. Service

概念:提供 Pod 穩定的存取入口,解決 Pod IP 動態變動的問題。

用途:這裡使用 ClusterIP,將流量導向帶有 app=demo-app 標籤的 Pod,並對內部開放 8080 port。

apiVersion: v1
kind: Service
metadata:
  name: demo-svc
spec:
  selector:
    app: demo-app
  ports:
    - port: 8080
      targetPort: 8080
      protocol: TCP
  type: ClusterIP

● 實作步驟

1.啟動Minikube並切回Minikube的Docker環境

https://ithelp.ithome.com.tw/upload/images/20250827/20178156pHPMVclhem.png

2.建立檔案 → 撰寫 ConfigMap、Secret、Deployment、Service 的 YAML

https://ithelp.ithome.com.tw/upload/images/20250827/20178156yWPvEN2HEK.png
https://ithelp.ithome.com.tw/upload/images/20250827/201781560IlJdbqjlp.png
https://ithelp.ithome.com.tw/upload/images/20250827/20178156yG5va2mMs3.png

3.建立腳本並執行,套用資源 → minikube kubectl -- apply -f …

https://ithelp.ithome.com.tw/upload/images/20250827/20178156l2dmyHtyQu.png

4.建立腳本並執行,驗證環境變數與掛載檔案 → printenv / ls /etc/...

https://ithelp.ithome.com.tw/upload/images/20250827/201781561xBudDk1Lx.png

5.建立腳本並執行,清除資源 (視需要) → 重置環境,方便重跑實驗

https://ithelp.ithome.com.tw/upload/images/20250827/20178156YtOLbxF8Zq.png

● 注意事項

🔸ConfigMap 適合非敏感資料;Secret 用於敏感資料。

🔸Secret 雖然用 Base64 存放,但不是加密,建議搭配 Vault 或 KMS。

🔸建立 Secret 時要注意權限控管(RBAC),避免不必要的讀取。

🔸ConfigMap 與 Secret 更新後,Pod 不會自動重啟,需搭配 Checksum Annotation 或 kubectl rollout restart。

● 總結

🔸今天介紹了 ConfigMap、Secret、Deployment、Service 四個 Kubernetes 中的關鍵元件。

🔸ConfigMap 與 Secret 分別處理 設定檔管理 與 敏感資訊管理;Deployment 與 Service 則確保應用程式能正常運作與存取。

🔸透過這些資源,我們能夠將程式碼與環境設定解耦,提升部署的靈活性與安全性。

👉 下一篇:Day 15 : Helm Chart 入門(實作)


上一篇
Day 13 : 用 Deployment、Service 與 Ingress 打造完整的 K8s 對外服務流程
下一篇
Day 15:從 YAML 到 Helm:打造可重用的部署模板
系列文
DevOps 進化論:從全能型戰士到安全守門員19
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言